前一篇我們用了不到20行的程式,解析使用者說的話,程式了解語意後,要如何回應呢? 今天就來探討一下吧。
回應的作法有很多種:
from sklearn.feature_extraction.text import CountVectorizer
#語料
corpus = [
'This is the first document.',
'This is the second second document.',
'And the third one.',
'Is this the first document?',
]
#將文件中的詞語轉換為詞頻矩陣
vectorizer = CountVectorizer()
#計算個詞語出現的次數
X = vectorizer.fit_transform(corpus)
#獲取詞袋中所有文件關鍵字
word = vectorizer.get_feature_names()
print ("word vocabulary=", word)
#查看詞頻結果
print ("BOW=", X.toarray())
from sklearn.feature_extraction.text import TfidfTransformer
#類調用
transformer = TfidfTransformer()
print ("transformer=", transformer)
#將詞頻矩陣X統計成TF-IDF值
tfidf = transformer.fit_transform(X)
#查看資料結構 tfidf[i][j]表示i類文件中的tf-idf權重
print ("tfidf=", tfidf.toarray())
# 最後一句與其他句的相似度
from sklearn.metrics.pairwise import cosine_similarity
print (cosine_similarity(tfidf[-1], tfidf, dense_output=False))
print (cosine_similarity(tfidf[-1], tfidf))
他們針對人事時地物的NER(Named-entity recognition)解析都有Library支援。
找個 open source Package 感受一下,ChatterBot 是一個自己設計問題及答案的套件,好像只能在Linux安裝,我在Windows下安裝失敗,就改在WSL(Windows Subsystem for Linux)安裝,還蠻順利的,指令如下:
pip install chatterbot
ChatterBot 是以知識圖(knowledge graph)儲存訓練及對話記錄,如下圖:
圖. 兩段對話原始內容,圖形來源:https://chatterbot.readthedocs.io/en/stable/training.html
圖. 兩段對話合併的結果,圖形來源:https://chatterbot.readthedocs.io/en/stable/training.html
舉兩個範例說明:
from chatterbot import ChatBot
# 產生一個 ChatBot,取名為 "Ron Obvious"
chatbot = ChatBot("Ron Obvious")
from chatterbot.trainers import ListTrainer
# 訓練資料
conversation = [
"Hello",
"Hi there!",
"How are you doing?",
"I'm doing great.",
"That is good to hear",
"Thank you.",
"You're welcome."
]
# 訓練模型
trainer = ListTrainer(chatbot)
trainer.train(conversation)
# 測試
while True:
str = input("your question:")
if len(str) == 0: break
response = chatbot.get_response(str)
print(response)
對話中每個句子是前一個句子的回答,所以,輸入『Hello』,程式會回答『Hi there!』,輸入故意漏一兩個單字,發現效果並不太好,例如輸入『Thanks』,預期程式會回答『You're welcome.』,結果回答『Thank you.』,根據文件說明,系統會儲存對話內容,使系統愈來愈聰明。
另外系統業提供一些常見的邏輯連接器(logic adapters),例如,數學式的估算、目前時間的查詢,請看下面程式:
from chatterbot import ChatBot
# 產生一個 ChatBot,加入兩個邏輯連接器(logic adapters)
bot = ChatBot(
'Math & Time Bot',
logic_adapters=[
'chatterbot.logic.MathematicalEvaluation',
'chatterbot.logic.TimeLogicAdapter'
]
)
# 數學式估算
response = bot.get_response('What is 4 + 9?')
print(response)
# 目前時間查詢
response = bot.get_response('What time is it?')
print(response)
執行果如下圖:
ChatBot 是一個物超所值的應用,技術門檻也不高,如果你的公司還沒有導入,那就趕快建議公司開始規劃吧!